/*
 * G711Encoder.h
 *
 *  Created on: 2017年2月17日
 *      Author: chuanjiang.zh
 */

#ifndef CG711ENCODER_H_
#define CG711ENCODER_H_

#include "MediaEncoder.h"
#include "Ffmpeg.h"

extern "C"
{
#include "libswresample/swresample.h"
#include "libavutil/audio_fifo.h"
}


namespace av
{

class G711Encoder: public MediaEncoder
{
public:
	G711Encoder();
	virtual ~G711Encoder();

	virtual int open(const MediaProfile& profile);

	virtual void close();

	virtual bool isOpen();

	virtual int encode(AVFrame* frame, AVPacket* pkt);

	virtual void flush();

	virtual bool getMediaFormat(MediaFormat& fmt);

	/// 获取输入的帧格式 
	virtual bool getInputFormat(int& pixelFormat, int& sampleFormat);

	/// 启用硬件加速 
	virtual void enableAccel(bool enabled);

	virtual bool setParam(const String& name, const char* value);

protected:
	int openEncoder(const MediaProfile& profile);
	void closeEncoder();
	bool isEncoderOpen();

	bool isSamleFormat(int fmt, int channels, int sampleRate);
	int resample(AVFrame* inFrame, AVFrame* outFrame);

	int encodeFrame(AVFrame* frame, AVPacket* pkt);

protected:
	MediaProfile	m_profile;
	AVCodecContext* m_codecContext;
	SwrContext*		m_swrContext;


};


} /* namespace av */

#endif /* CG711ENCODER_H_ */
